Java programs may be run on any machine on which a Java virtual machine (JVM) is executing. In a JVM (e.g., Dalvik), Java bytecodes may be executed using an interpreter at the start of a Java program. For example, before a Java program is executed, source codes of the program are broken down into Java bytecodes. At runtime, the Java interpreter of the JVM interprets the bytecodes. As an alternative, the JVM may choose not to interpret the bytecodes, but rather compile the bytecodes down into native codes. The JVM then causes the native codes to be executed directly by one or more processors. For example, frequently-used bytecodes are compiled into native codes to improve the running performance.
Just-in-time compilation (JIT), also known as dynamic translation, is compilation done during execution of a program or an application at run time, rather than prior to execution. Often JIT involves translation/compilation to native codes for Java programs. For example, native codes (e.g., trace) are put into a JIT code cache for execution. As shown in FIG. 1, a JIT code cache 100 includes commonly-used subroutines (e.g., TEMPLATE_CMP_LONG) and native codes (e.g., Trace-1).